1:- ['../../data/complete caviar/appearance.prolog'].    2:- ['../../data/complete caviar/movementB.prolog'].    3:- ['../../data/complete caviar/list-of-ids.prolog'].    4
    5:- ['../../CE patterns/compiled_caviar_CE_patterns.prolog'].    6
    7%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    8% Notes: 
    9% In this application, WM=Step, while the LastTime of the dataset is 1007000.
   10% TimesFile records the event recognition times, 
   11% while InputFile records the number of input events per window.
   12%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   13
   14continuousER(TimesFile, InputFile, WM, Step, LastTime) :-
   15  open(TimesFile, write, TimesStream),
   16  open(InputFile, write, InputStream),
   17  initialiseRecognition(ordered, preprocessing, 40),
   18  updateManySDE(0, WM), %retractOrientation,
   19  WMPlus1 is WM+1, 
   20  % the first event recognition time should not be counted
   21  % because there are no old input facts being retracted
   22  eventRecognition(WM, WMPlus1),
   23  CurrentTime is WM+Step,
   24  updateManySDE(WM, CurrentTime), 
   25  write('ER: '), write(CurrentTime), write(WM), nl, 
   26  statistics(cputime, [S1,T1]), 
   27  eventRecognition(CurrentTime, WM), 
   28  findall((F=V,L), (outputEntity(F=V),holdsFor(F=V,L)), CC),  
   29  statistics(cputime, [S2,T2]), T is T2-T1, S is S2-S1, %S=T2,
   30  write(TimesStream, S),
   31  NewCurrentTime is CurrentTime+Step,
   32  findall((A,B), happensAtIE(A,B), SDEList), 
   33  length(SDEList, SDEL),
   34  findall((A,B), holdsAtIE(A,B), InputList), 
   35  length(InputList, InputL),
   36  Input is SDEL+InputL,
   37  write(InputStream, Input),
   38  querying(TimesStream, InputStream, WM, Step, NewCurrentTime, LastTime, [S], WorstCase, [Input], InputSum),
   39  % calculate average query time
   40  sum_list(WorstCase, Sum),
   41  length(WorstCase, L),
   42  AvgTime is Sum/L,
   43  nl(TimesStream), write(TimesStream, AvgTime),
   44  % calculate max query time
   45  max_list(WorstCase, Max),
   46  nl(TimesStream), write(TimesStream, Max),
   47  % calculate avg input facts
   48  sum_list(InputSum, ISum),
   49  AvgInput is ISum/L,
   50  nl(InputStream), write(InputStream, AvgInput),
   51  close(TimesStream),
   52  close(InputStream), !.
   53
   54querying(_TimesStream, _InputStream, _WM, _Step, CurrentTime, LastTime, WorstCase, WorstCase, InputSum, InputSum) :- 
   55  CurrentTime >= LastTime, !.
   56
   57querying(TimesStream, InputStream, WM, Step, CurrentTime, LastTime, InitWorstCase, WorstCase, InitInput, InputSum) :- 
   58  OldCurrentTime is CurrentTime-Step,
   59  updateManySDE(OldCurrentTime, CurrentTime), 
   60  Diff is CurrentTime-WM,
   61  write('ER: '),write(CurrentTime),write(' '),write(WM),nl,
   62  statistics(cputime,[S1,T1]), 
   63  eventRecognition(CurrentTime, WM), 
   64  findall((F=V,L), (outputEntity(F=V),holdsFor(F=V,L)), CC),  
   65  statistics(cputime,[S2,T2]), 
   66  T is T2-T1, S is S2-S1, %S=T2,
   67  writeResult(S, TimesStream),
   68  NewCurrentTime is CurrentTime+Step,
   69  findall((A,B), happensAtIE(A,B), SDEList), 
   70  length(SDEList, SDEL),
   71  findall((A,B), holdsAtIE(A,B),InputList), 
   72  length(InputList, InputL),
   73  Input is SDEL+InputL,
   74  writeResult(Input, InputStream),
   75  querying(TimesStream, InputStream, WM, Step, NewCurrentTime, LastTime, [S|InitWorstCase], WorstCase, [Input|InitInput], InputSum).
   76
   77%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   78% I/O Utils
   79%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   80
   81writeResult(Time, Stream):-
   82  write(Stream,'+'), write(Stream,Time).
   83
   84
   85%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   86% update SDE
   87%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   88
   89updateSDE(Start, End) :-
   90	findall(Start, updateSDE(movement, Start, End), _),
   91	findall(Start, updateSDE(appearance, Start, End), _).
   92
   93
   94updateManySDE(Start, End) :-
   95	Diff is End-Start,
   96	Diff =< 1000,
   97	!,
   98	updateSDE(Start, End).	
   99
  100updateManySDE(Start, End) :-
  101	Diff is End-Start,
  102	Diff > 1000,
  103	NewStart is Start + 1000,
  104	updateSDE(Start, NewStart),
  105	updateManySDE(NewStart, End)